package br.com.velp.sudecap.serviceimpl;

import br.com.velp.sudecap.comum.ValidationException;
import br.com.velp.sudecap.dao.EmpreendimentoDAO;
import br.com.velp.sudecap.dto.EmpreendimentoParametrosConsultaDTO;
import br.com.velp.sudecap.entidade.Empreendimento;
import br.com.velp.sudecap.entidade.Regional;
import br.com.velp.sudecap.service.EmpreendimentoService;
import java.util.List;
import org.hibernate.criterion.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisitos_afetados> RF003.01 - Listar Empreendimentos / RF003.02 - Cadastrar Empreendimentos </requisitos_afetados>
 * <descricao> Classe Responsável Pela Aplicação de Regras de Negócio 
 *             Referentes as Operações de CRUD do Contexto de Empreendimentos </descricao>
 * </sumario>
 */
@Service("empreendimentoService")
@Transactional(readOnly = true)
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class EmpreendimentoServiceImpl implements EmpreendimentoService{
    
    public static final Long serialVersionUID = 1L;
    
    @Autowired
    private EmpreendimentoDAO empreendimentoDAO;

    @Transactional(readOnly = false)
    @Override
    public Long salvar(Empreendimento empreendimento) throws ValidationException{
	validarEmpreendimento(empreendimento);
	return this.empreendimentoDAO.salvar(empreendimento);
    }
    
    @Transactional(readOnly = false)
    @Override
    public void atualizar(Empreendimento empreendimento) throws ValidationException{
	validarEmpreendimento(empreendimento);
	this.empreendimentoDAO.atualizar(empreendimento);
    }
    
    @Transactional(readOnly = false)
    @Override
    public void excluir(Empreendimento empreendimento){
	this.empreendimentoDAO.excluir(empreendimento);
    }
    
    @Override
    public Empreendimento obterPorId(Long idEmpreendimento){
	return this.empreendimentoDAO.obterPorId(idEmpreendimento);
    }

    @Override
    public int contarEmpreendimentos(EmpreendimentoParametrosConsultaDTO parametros){
	return this.empreendimentoDAO.contarEmpreendimentos(parametros);
    }
    
    @Override
    public List<Empreendimento> buscarEmpreendimentosPaginados(int firstResult, int maxResults, EmpreendimentoParametrosConsultaDTO parametros, Order order){
	return this.empreendimentoDAO.buscarEmpreendimentosPaginados(firstResult, maxResults, parametros, order);
    }
    
    @Override
    public List<Regional> recuperarTodasRegionais(){
	return this.empreendimentoDAO.recuperarTodasRegionais();
    }
    
    private void validarEmpreendimento(Empreendimento empreendimento) throws ValidationException{
	ValidationException validacao = new ValidationException();
	if(empreendimento.getDataInicio() != null && empreendimento.getDataTermino() != null
		&& empreendimento.getDataInicio().after(empreendimento.getDataTermino())){
	    validacao.adicionarMensagem("empreendimentoValidacaoDataInicioMaiorDataTermino");
	}
	if(empreendimento.getDataInicio() != null && empreendimento.getDataPrevistaTermino() != null
		&& empreendimento.getDataInicio().after(empreendimento.getDataPrevistaTermino())){
	    validacao.adicionarMensagem("empreendimentoValidacaoDataInicioMaiorDataPrevistaTermino");
	}
	if(validacao.hasErros()){
	    throw validacao;
	}
    }
    
}
